// filesender.cpp
#include "filesender.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QFileInfo>
#include <QDebug>
#include <QThread>
#include <unistd.h>

const int BASE64_SIZE = 1024 * 20  ;//最大的速度了，再快发不过去了

FileSender::FileSender(const QString &filePath, const QString &host, quint16 port, QObject *parent)
    : QObject(parent), filePath(filePath), host(host), port(port) {
    udpSocket = new QUdpSocket(this);
}

void FileSender::startSending() {
    QFileInfo fileInfo(filePath);
    QString fileName = fileInfo.fileName();
    QFile file(filePath);

    if (file.open(QIODevice::ReadOnly)) {
        qint64 totalBytes = fileInfo.size(); // 文件总大小
        qint64 bytesSent = 0; // 已发送字节数
        bool isFirstChunk = true;

        while (!file.atEnd()) {
            QByteArray buffer = file.read(BASE64_SIZE);
            if (buffer.isEmpty()) {
                break;
            }

            QJsonObject jsonObj;
            jsonObj["file_name"] = fileName;//保存文件名
            jsonObj["file_data"] = QString::fromUtf8(buffer.toBase64());// 将数据缓冲区 (buffer) 编码为 Base64 格式
            jsonObj["status"] = isFirstChunk ? "new" : "app";//设置文件发过去的状态
            jsonObj["file_size"] = totalBytes;//发送文件的总体大小
            isFirstChunk = false;//是否第一次发送

            QJsonDocument jsonDoc(jsonObj);
            QByteArray jsonData = jsonDoc.toJson();

            qint64 ret = udpSocket->writeDatagram(jsonData, QHostAddress(host), port);
            qDebug() << "发送的字节数:" << ret;

            bytesSent += ret; // 更新已发送字节数

            // 计算并显示进度百分比
            double percentage = ((bytesSent * 1.0)/ totalBytes) * 100.0;
           // qDebug() << "已发送百分比:" << percentage << "%";

            usleep(6000); // 控制发送速率
        }
        file.close();

    } else {
        qDebug() << "无法打开文件:" << file.errorString();
    }


    emit finished();
    qDebug() << "finish";
}
